package com.lvan.commontuils.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.ibatis.jdbc.Null;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Map;

/**
 * @author LuoMeng
 */
public class JwtUtils {

    /**
     * EXPIRE：token 过期时间
     * APP_SECRET： 密钥
     */
    private static final long EXPIRE = 1000 * 60 * 60 * 24;
    private static final String APP_SECRET = "312C912C-C6f8-4EB2-Aa47-18A4b95654E6";

    /**
     * 生成Token信息
     *
     * @param map 载体信息
     * @return String
     */
    public static String getToken(Map<String, Object> map) {
        return Jwts.builder()
                // JWT头信息，默认为{"typ": "JWT", "alg": "HS256"}
                .setHeaderParam("alg", "HS256")
                .setHeaderParam("typ", "JWT")
                // 载体信息
                .setClaims(map)
                // 签发时间
                .setIssuedAt(new Date())
                // 过期时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                // 签名
                .signWith(SignatureAlgorithm.ES256, APP_SECRET)
                .compact();
    }

    /**
     * 检测Token是否有效
     *
     * @param token token串
     * @return Boolean
     */
    public static boolean checkToken(String token) {
        if (StringUtils.hasLength(token)) {
            return false;
        }
        try {
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(token);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 检测Token是否有效
     *
     * @param request request请求
     * @return Boolean
     */
    public static boolean checkToken(HttpServletRequest request) {
        try {
            String token = request.getHeader("token");
            if (StringUtils.hasLength(token)) {
                return false;
            }
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(token);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 获取请求头中的用户ID
     *
     * @param request request请求
     * @return String
     */
    public static String getUserIdByToken(HttpServletRequest request) {
        try {
            String token = request.getHeader("token");
            if (StringUtils.hasLength(token)) {
                return "";
            }
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(token);
            Claims body = claimsJws.getBody();
            return (String) body.get("id");
        } catch (Exception e) {
            return "";
        }
    }

}
